package com.fanghaoran.dao;

import com.fanghaoran.bean.Interaction;
import com.fanghaoran.entity.Users;
import com.fanghaoran.service.UserService;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * @Author: win11
 * @Date: 2023/03/22/1:32
 * @Description: 用户相关业务的数据库操作
 */
public class UserDao extends BaseDao {

    /**
     * 登录业务
     * @param user 将用户输入的用户名和密码封装成用户类传递过来
     */
    public Interaction login(Users user,int isManager) {
        //不为空,连接数据库验证用户名是否存在
        //调用工具类下dao包的DQL方法
        String sql = "select * from user_info where username=? and manager=?;";
        //数据库查询返回的结果集
        List<Users> users = new ArrayList<>();
        try {
            //参数一:存储每一行数据的对象类
            //参数二:sql语句
            users = BaseDao.executeQuery(Users.class, sql, user.getUsername(),isManager);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        if (!users.isEmpty()) {
            //拿到数据库中该用户存储的盐
            String saltBase64 = users.get(0).getSalt();
            //对盐解码
            byte[] salt = Base64.getDecoder().decode(saltBase64);
            //拿到用户输入的密码,将它与数据库中该用户存储的盐进行哈希加密运算,得到的结果和数据库中存储的加盐后的密码一致,说明密码正确
            byte[] hashPassword = UserService.hashPassword(user.getPassword(),salt);
            //对用户的输入加密后进行编码
            String hashPasswordString = Base64.getEncoder().encodeToString(hashPassword);

            if(users.get(0).getPassword().equals(hashPasswordString)){
                //用户名和密码都正确,判断该用户是否被管理员拉黑
                if(users.get(0).getBlocked()==1){
                    return new Interaction("您已被管理员拉黑,无法登录",null);
                }else {
                    //登录成功,把结果封装成对象传给service
                    return new Interaction("登录成功!", user);
                }
            }else{
                return new Interaction("密码错误,登录失败!",null);
            }
        } else {
            //登录失败,把结果封装成对象传给service
            return new Interaction("用户名错误,登录失败!", null);
        }
    }

    /**
     * 注册业务
     * @param user 注册用户的信息
     */
    public Interaction register(Users user) throws Exception {
        //查询用户名是否存在
        String sql = "select * from user_info where username=?;";
        List<Users> users = new ArrayList<>();
        try {
            users = BaseDao.executeQuery(Users.class, sql, user.getUsername());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        //查询手机号是否已被绑定
        String sql2 = "select * from user_info where telephone=?;";
        List<Users> users1 = new ArrayList<>();
        try {
            users1 = BaseDao.executeQuery(Users.class, sql2, user.getTelephone());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        //判断用户名是否存在
        if (!users.isEmpty()) {
            return new Interaction("用户名已存在", null);
        }
        //判断手机号是否已被绑定
        else if (!users1.isEmpty()) {
            return new Interaction("该手机号已绑定其他账号", null);
        } else {
            //把数据写进数据库
            //写进用户表
            String sql3 = "insert into user_info(username,password,salt,telephone) values(?,?,?,?)";
            BaseDao.executeUpdate(sql3, user.getUsername(), user.getPassword(),user.getSalt(), user.getTelephone());
        //初始化其他数据表
            //先获取以及注册的用户数据
            String sql4="select * from user_info where username=?";
            List<Users> usersList = BaseDao.executeQuery(Users.class, sql4, user.getUsername());
            Users trueUser=usersList.get(0);
            //用户名写进打卡数据表
            //打卡标志和连续打卡次数默认为0
            String sql5="insert into sign_info(userId,clockDays,flag,lastClockDate) values(?,0,0,?);";
            BaseDao.executeUpdate(sql5,trueUser.getId(),LocalDateTime.now());
            //初始化统计学习单词个数表
            String sql6="insert into study_info(userId,wordAccount,studyTime,studyPlan) values(?,?,?,?);";
            BaseDao.executeUpdate(sql6,trueUser.getId(),0,0,0);
            return new Interaction("注册成功", user);
        }
    }
}
